/**
 * @file utils.h
 * @brief 算法工具模块头文件
 */

#ifndef ALGORITHM_UTILS_H
#define ALGORITHM_UTILS_H

/**
 * @brief 算法配置结构体
 */
typedef struct {
    // 滤波器参数
    int low_cut_freq;    // 高通滤波截止频率
    int high_cut_freq;   // 低通滤波截止频率
    
    // 窗函数参数
    int window_type;     // 窗函数类型
    int window_size;     // 窗函数大小
    
    // FFT参数
    int fft_size;        // FFT大小，通常是2的幂
    
    // VAD参数
    float vad_threshold; // VAD阈值
    
    // 预留参数
    void* extended_params; // 扩展参数
} AlgorithmConfig;

/**
 * @brief 算法状态结构体
 */
typedef struct {
    // 缓存数据
    float* buffer;       // 缓存音频数据
    int buffer_size;     // 缓存大小
    int buffer_pos;      // 当前缓存位置
    
    // FFT缓存
    float* fft_buffer;   // FFT缓存
    float* fft_result;   // FFT结果
    
    // VAD状态
    float vad_state;     // VAD状态
    float vad_energy;    // VAD能量
    
    // 预留状态
    void* extended_state; // 扩展状态
} AlgorithmState;

/**
 * @brief 创建算法状态
 * 
 * @param config 算法配置
 * @return AlgorithmState* 算法状态，失败返回NULL
 */
AlgorithmState* create_algorithm_state(const AlgorithmConfig* config);

/**
 * @brief 释放算法状态
 * 
 * @param state 算法状态
 */
void free_algorithm_state(AlgorithmState* state);

/**
 * @brief 获取默认算法配置
 * 
 * @param sample_rate 采样率
 * @param frame_size 帧大小
 * @return AlgorithmConfig 默认配置
 */
AlgorithmConfig get_default_algorithm_config(int sample_rate, int frame_size);

/**
 * @brief 执行快速傅里叶变换
 * 
 * @param input 输入数据
 * @param output 输出数据
 * @param size FFT大小
 * @return int 成功返回0，失败返回错误码
 */
int perform_fft(const float* input, float* output, int size);

/**
 * @brief 应用窗函数
 * 
 * @param data 音频数据
 * @param size 数据大小
 * @param window_type 窗函数类型
 * @return int 成功返回0，失败返回错误码
 */
int apply_window(float* data, int size, int window_type);

/**
 * @brief 计算频谱能量
 * 
 * @param spectrum 频谱数据
 * @param size 频谱大小
 * @return float 频谱能量
 */
float calculate_spectrum_energy(const float* spectrum, int size);

/**
 * @brief 计算频段能量
 * 
 * @param spectrum 频谱数据
 * @param size 频谱大小
 * @param start_freq 起始频率
 * @param end_freq 结束频率
 * @param sample_rate 采样率
 * @return float 频段能量
 */
float calculate_band_energy(const float* spectrum, int size, 
                          float start_freq, float end_freq, 
                          int sample_rate);

#endif /* ALGORITHM_UTILS_H */ 